package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.RangoDAO;
import mx.ipn.persistencia.dao.TipoPercepcionDescuentoDAO;
import mx.ipn.to.TipoPercepcionDescuentoTO;

public class TipoPercepcionDescuentoDAOMySQL implements
		TipoPercepcionDescuentoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(TipoPercepcionDescuentoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO tipo_percepcion_descuento(nombre,id_rango) VALUES(?,?)";
	private static final String UPDATE = "UPDATE tipo_percepcion_descuento SET nombre=?,id_rango=? WHERE id_tipo_percepcion_descuento=?";
	private static final String FINDBYID = "SELECT * FROM tipo_percepcion_descuento WHERE id_tipo_percepcion_descuento=?";
	private static final String FINDBYNOMBRE = "SELECT * FROM tipo_percepcion_descuento WHERE nombre=?";
	private static final String SELECT = "SELECT * FROM tipo_percepcion_descuento";
	private static final String SELECTBYRANGO = "SELECT * FROM tipo_percepcion_descuento WHERE id_rango=?";

	@Override
	public TipoPercepcionDescuentoTO findTipoPercepcionDescuentoById(
			int idTipoPercepcionDescuento) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idTipoPercepcionDescuento);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				RangoDAO rangoDAO = fabricaMySQL.getRangoDAO();

				TipoPercepcionDescuentoTO tipoPercepcionDescuentoTO = new TipoPercepcionDescuentoTO(
						idTipoPercepcionDescuento, rs.getString("nombre"),
						rangoDAO.findRangoById(rs.getInt("id_rango")));

				ps.close();
				conexion.close();
				return tipoPercepcionDescuentoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TipoPercepcionDescuentoTO findTipoPercepcionDescuentoByNombre(
			String nombre) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYNOMBRE);

			ps.setString(1, nombre);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				// Crea la fabrica especifica de MySQL
				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
				// Crea un DAO para la tabla TIPOEMPLEADO
				RangoDAO rangoDAO = fabricaMySQL.getRangoDAO();

				TipoPercepcionDescuentoTO tipoPercepcionDescuentoTO = new TipoPercepcionDescuentoTO(
						rs.getInt("id_tipo_percepcion_descuento"), rs
								.getString("nombre"), rangoDAO.findRangoById(rs
								.getInt("id_rango")));

				ps.close();
				conexion.close();
				return tipoPercepcionDescuentoTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertTipoPercepcionDescuento(
			TipoPercepcionDescuentoTO tipoPercepcionDescuentoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setString(1, tipoPercepcionDescuentoTO.getNombre());
			ps.setInt(2, tipoPercepcionDescuentoTO.getRangoTO().getIdRango());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<TipoPercepcionDescuentoTO> selectTipoPercepcionDescuento() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;
			
			RangoDAO rangoDAO = null;

			ArrayList<TipoPercepcionDescuentoTO> tipoPercepcionDescuentoTO = null;
			TipoPercepcionDescuentoTO tipoPercepcionDescuentoTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (tipoPercepcionDescuentoTO == null) {
					tipoPercepcionDescuentoTO = new ArrayList<TipoPercepcionDescuentoTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					rangoDAO = fabricaMySQL.getRangoDAO();
				}

				tipoPercepcionDescuentoTO2 = new TipoPercepcionDescuentoTO(rs
						.getInt("id_tipo_percepcion_descuento"), rs
						.getString("nombre"), rangoDAO.findRangoById(rs
						.getInt("id_rango")));

				tipoPercepcionDescuentoTO.add(tipoPercepcionDescuentoTO2);
			}
			ps.close();
			conexion.close();
			return tipoPercepcionDescuentoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TipoPercepcionDescuentoTO selectTipoPercepcionDescuentoByRango(
			int idRango) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			RangoDAO rangoDAO = null;

			ArrayList<Integer> listIdTipoPercepcionDescuento = null;
			ArrayList<String> listNombre = null;

			TipoPercepcionDescuentoTO tipoPercepcionDescuentoTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYRANGO);
			ps.setInt(1, idRango);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTipoPercepcionDescuento == null) {

					listIdTipoPercepcionDescuento = new ArrayList<Integer>();
					listNombre = new ArrayList<String>();

					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					rangoDAO = fabricaMySQL.getRangoDAO();
				}

				listIdTipoPercepcionDescuento.add(rs
						.getInt("id_tipo_percepcion_descuento"));
				listNombre.add(rs.getString("nombre"));

			}
			if (listIdTipoPercepcionDescuento != null) {
				
				String[] arrNombre = (String[])listNombre.toArray(new String[listNombre.size()]);
				Integer[] arrIdTipoPercepcionDescuento = (Integer[])listIdTipoPercepcionDescuento.toArray(new Integer[listIdTipoPercepcionDescuento.size()]);
				
				tipoPercepcionDescuentoTO = new TipoPercepcionDescuentoTO(
						arrIdTipoPercepcionDescuento, arrNombre, rangoDAO
								.findRangoById(idRango));
			}
			ps.close();
			conexion.close();
			return tipoPercepcionDescuentoTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateTipoPercepcionDescuento(
			TipoPercepcionDescuentoTO tipoPercepcionDescuentoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);
			
			ps.setString(1, tipoPercepcionDescuentoTO.getNombre());
			ps.setInt(2, tipoPercepcionDescuentoTO.getRangoTO().getIdRango());
			ps.setInt(3, tipoPercepcionDescuentoTO.getIdTipoPercepcionDescuento());
			
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
